--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
scripts/argos_translate.py v4.7.1-rc.1 (02d14248) Text, 9.05 KB
T8b949e#!/usr/bin/env python3
T8b949e"""Argos Translate JSON localization script.
This script provides an automated workflow to translate JSON localization files
(such as `en.json`) to target languages using Argos Translate. It ensures that
interpolated variables (e.g., `{count}`, `{status}`) are preserved and not
altered during the translation process.
Requirements:
- argostranslate (pip install argostranslate)
Usage:
python scripts/argos_translate.py --from en --to zh --input locales/en.json --output locales/zh.json
You can also use environment variables instead of CLI flags:
ARGOS_FROM_LANG="en"
ARGOS_TO_LANG="zh"
ARGOS_INPUT_FILE="locales/en.json"
ARGOS_OUTPUT_FILE="locales/zh.json"
"""
Tff7b72import T7ee787argparse
Tff7b72import T7ee787json
Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72import T7ee787sys
Tff7b72import T7ee787time
T8b949e# ANSI color codes for terminal output
Tff7b72class T56d364ColorsTb4b4b4:
Te6edf3HEADER Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[95mTa5d6ff"
Te6edf3OKBLUE Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[94mTa5d6ff"
Te6edf3OKCYAN Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[96mTa5d6ff"
Te6edf3OKGREEN Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[92mTa5d6ff"
Te6edf3WARNING Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[93mTa5d6ff"
Te6edf3FAIL Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[91mTa5d6ff"
Te6edf3ENDC Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[0mTa5d6ff"
Te6edf3BOLD Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[1mTa5d6ff"
Te6edf3UNDERLINE Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[4mTa5d6ff"
Tff7b72def Td2a8ffprint_infoTb4b4b4(Te6edf3msgTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3ColorsTff7b72.Td2a8ffOKCYANTffd700}Ta5d6ff[INFO]Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff Tffd700{Te6edf3msgTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffprint_successTb4b4b4(Te6edf3msgTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3ColorsTff7b72.Td2a8ffOKGREENTffd700}Ta5d6ff[SUCCESS]Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff Tffd700{Te6edf3msgTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffprint_warningTb4b4b4(Te6edf3msgTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3ColorsTff7b72.Td2a8ffWARNINGTffd700}Ta5d6ff[WARNING]Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff Tffd700{Te6edf3msgTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffprint_errorTb4b4b4(Te6edf3msgTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3ColorsTff7b72.Td2a8ffFAILTffd700}Ta5d6ff[ERROR]Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff Tffd700{Te6edf3msgTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787argostranslateT7ee787.T7ee787package
Tff7b72import T7ee787argostranslateT7ee787.T7ee787translate
Tff7b72except Tf85149ImportErrorTb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6ff"Ta5d6ffThe Ta5d6ff'Ta5d6ffargostranslateTa5d6ff'Ta5d6ff module is not installed.Ta5d6ff"Tb4b4b4)
Te6edf3print_infoTb4b4b4(Ta5d6ff"Ta5d6ffPlease install it using: pip install argostranslateTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ffensure_package_installedTb4b4b4(Te6edf3from_codeTb4b4b4, Te6edf3to_codeTb4b4b4)Tb4b4b4:
T8b949e"""Ensure the translation package from `from_code` to `to_code` is installed.
If not installed, attempts to download and install it automatically.
"""
Te6edf3installed Tff7b72= Te6edf3argostranslateTff7b72.Td2a8fftranslateTff7b72.Td2a8ffget_installed_languagesTb4b4b4(Tb4b4b4)
Te6edf3installed_dict Tff7b72= Tb4b4b4{Te6edf3langTff7b72.Td2a8ffcodeTb4b4b4: Te6edf3lang Tff7b72for Te6edf3lang Tff7b72in Te6edf3installedTb4b4b4}
Te6edf3from_lang Tff7b72= Te6edf3installed_dictTff7b72.Td2a8ffgetTb4b4b4(Te6edf3from_codeTb4b4b4)
Te6edf3to_lang Tff7b72= Te6edf3installed_dictTff7b72.Td2a8ffgetTb4b4b4(Te6edf3to_codeTb4b4b4)
Tff7b72if Tff7b72not Te6edf3from_lang Tff7b72or Tff7b72not Te6edf3to_lang Tff7b72or Te6edf3to_lang Tff7b72not Tff7b72in Te6edf3from_langTff7b72.Td2a8fftranslations_fromTb4b4b4:
Te6edf3print_warningTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffTranslation package Tffd700{Te6edf3from_codeTffd700}Ta5d6ff -> Tffd700{Te6edf3to_codeTffd700}Ta5d6ff not found. Attempting to install...Ta5d6ff"
Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3argostranslateTff7b72.Td2a8ffpackageTff7b72.Td2a8ffupdate_package_indexTb4b4b4(Tb4b4b4)
Te6edf3available_packages Tff7b72= Te6edf3argostranslateTff7b72.Td2a8ffpackageTff7b72.Td2a8ffget_available_packagesTb4b4b4(Tb4b4b4)
Te6edf3pkg_to_install Tff7b72= Tff7b72None
Tff7b72for Te6edf3pkg Tff7b72in Te6edf3available_packagesTb4b4b4:
Tff7b72if Te6edf3pkgTff7b72.Td2a8fffrom_code Tff7b72== Te6edf3from_code Tff7b72and Te6edf3pkgTff7b72.Td2a8ffto_code Tff7b72== Te6edf3to_codeTb4b4b4:
Te6edf3pkg_to_install Tff7b72= Te6edf3pkg
Tff7b72break
Tff7b72if Te6edf3pkg_to_installTb4b4b4:
Te6edf3print_infoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDownloading package: Tffd700{Te6edf3pkg_to_installTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3argostranslateTff7b72.Td2a8ffpackageTff7b72.Td2a8ffinstall_from_pathTb4b4b4(Te6edf3pkg_to_installTff7b72.Td2a8ffdownloadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3print_successTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffSuccessfully installed package: Tffd700{Te6edf3from_codeTffd700}Ta5d6ff -> Tffd700{Te6edf3to_codeTffd700}Ta5d6ff"
Tb4b4b4)
T8b949e# Refresh installed languages
Te6edf3installed Tff7b72= Te6edf3argostranslateTff7b72.Td2a8fftranslateTff7b72.Td2a8ffget_installed_languagesTb4b4b4(Tb4b4b4)
Te6edf3installed_dict Tff7b72= Tb4b4b4{Te6edf3langTff7b72.Td2a8ffcodeTb4b4b4: Te6edf3lang Tff7b72for Te6edf3lang Tff7b72in Te6edf3installedTb4b4b4}
Tff7b72elseTb4b4b4:
Te6edf3print_errorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffCould not find a translation package for Tffd700{Te6edf3from_codeTffd700}Ta5d6ff -> Tffd700{Te6edf3to_codeTffd700}Ta5d6ff"
Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFailed to install language package: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72return Te6edf3installed_dictTff7b72.Td2a8ffgetTb4b4b4(Te6edf3from_codeTb4b4b4)Tb4b4b4, Te6edf3installed_dictTff7b72.Td2a8ffgetTb4b4b4(Te6edf3to_codeTb4b4b4)
Tff7b72def Td2a8ffget_translation_funcTb4b4b4(Te6edf3from_codeTb4b4b4, Te6edf3to_codeTb4b4b4)Tb4b4b4:
T8b949e"""Returns a translation function for the specified language pair."""
Te6edf3from_langTb4b4b4, Te6edf3to_lang Tff7b72= Te6edf3ensure_package_installedTb4b4b4(Te6edf3from_codeTb4b4b4, Te6edf3to_codeTb4b4b4)
Te6edf3translator Tff7b72= Te6edf3from_langTff7b72.Td2a8ffget_translationTb4b4b4(Te6edf3to_langTb4b4b4)
Tff7b72if Tff7b72not Te6edf3translatorTb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo translation available from Tffd700{Te6edf3from_codeTffd700}Ta5d6ff to Tffd700{Te6edf3to_codeTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72return Te6edf3translatorTff7b72.Td2a8fftranslate
Tff7b72def Td2a8ffreplace_vars_with_tokensTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4:
T8b949e"""Replaces `{variable}` patterns with a standard token like `XVAR0X`.
So the translation engine doesn't attempt to translate variable names.
Returns the modified text and the list of found variables.
"""
Te6edf3vars_found Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72def Td2a8ffreplacerTb4b4b4(Te6edf3matchTb4b4b4)Tb4b4b4:
Te6edf3vars_foundTff7b72.Td2a8ffappendTb4b4b4(Te6edf3matchTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff XVARTffd700{Tffa657lenTb4b4b4(Te6edf3vars_foundTb4b4b4) Tff7b72- T79c0ff1Tffd700}Ta5d6ffX Ta5d6ff"
Te6edf3replaced_text Tff7b72= Te6edf3reTff7b72.Td2a8ffsubTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff\Ta5d6ff{Ta5d6ff+.*?Ta5d6ff\Ta5d6ff}+Ta5d6ff"Tb4b4b4, Te6edf3replacerTb4b4b4, Te6edf3textTb4b4b4)
Tff7b72return Te6edf3replaced_textTb4b4b4, Te6edf3vars_found
Tff7b72def Td2a8ffrestore_vars_from_tokensTb4b4b4(Te6edf3textTb4b4b4, Te6edf3vars_foundTb4b4b4)Tb4b4b4:
T8b949e"""Restores the original `{variable}` patterns back into the translated text.
Looks for the `XVAR0X` tokens.
"""
Tff7b72for Te6edf3iTb4b4b4, Te6edf3var Tff7b72in Tffa657enumerateTb4b4b4(Te6edf3vars_foundTb4b4b4)Tb4b4b4:
T8b949e# The translation engine might change case or spacing around the token
Te6edf3text Tff7b72= Te6edf3reTff7b72.Td2a8ffsubTb4b4b4(Ta5d6ffrfTa5d6ff"Ta5d6ff\Ta5d6ffs*[xX][vV][aA][rR]Tffd700{Te6edf3iTffd700}Ta5d6ff[xX]Ta5d6ff\Ta5d6ffs*Ta5d6ff"Tb4b4b4, Te6edf3varTb4b4b4, Te6edf3textTb4b4b4)
Tff7b72return Te6edf3textTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftranslate_dictTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3translate_funcTb4b4b4, Te6edf3target_nameTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Recursively iterates over a dictionary and translates all string values.
Skips the `_languageName` key, which can be explicitly set.
"""
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Te6edf3new_dict Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3dataTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3k Tff7b72== Ta5d6ff"Ta5d6ff_languageNameTa5d6ff" Tff7b72and Te6edf3target_nameTb4b4b4:
Te6edf3new_dictTb4b4b4[Te6edf3kTb4b4b4] Tff7b72= Te6edf3target_name
Tff7b72continue
Tff7b72if Te6edf3k Tff7b72== Ta5d6ff"Ta5d6ff_languageNameTa5d6ff"Tb4b4b4:
T8b949e# Keep original if no target name provided
Te6edf3new_dictTb4b4b4[Te6edf3kTb4b4b4] Tff7b72= Te6edf3v
Tff7b72continue
Te6edf3new_dictTb4b4b4[Te6edf3kTb4b4b4] Tff7b72= Te6edf3translate_dictTb4b4b4(Te6edf3vTb4b4b4, Te6edf3translate_funcTb4b4b4, Te6edf3target_nameTb4b4b4)
Tff7b72return Te6edf3new_dict
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4[Te6edf3translate_dictTb4b4b4(Te6edf3itemTb4b4b4, Te6edf3translate_funcTb4b4b4, Te6edf3target_nameTb4b4b4) Tff7b72for Te6edf3item Tff7b72in Te6edf3dataTb4b4b4]
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3dataTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3data
Te6edf3temp_textTb4b4b4, Te6edf3vars_found Tff7b72= Te6edf3replace_vars_with_tokensTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3translated_temp Tff7b72= Te6edf3translate_funcTb4b4b4(Te6edf3temp_textTb4b4b4)
Tff7b72return Te6edf3restore_vars_from_tokensTb4b4b4(Te6edf3translated_tempTb4b4b4, Te6edf3vars_foundTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3print_warningTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffFailed to translate Ta5d6ff'Tffd700{Te6edf3dataTffd700}Ta5d6ff'Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff. Falling back to original.Ta5d6ff"
Tb4b4b4)
Tff7b72return Te6edf3data
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3data
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(
Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffTranslate JSON localization files using Argos Translate.Ta5d6ff"
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff--fromTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6fffrom_langTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffSource language code (e.g. Ta5d6ff'Ta5d6ffenTa5d6ff'Ta5d6ff)Ta5d6ff"
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--toTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6ffto_langTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffTarget language code (e.g. Ta5d6ff'Ta5d6ffzhTa5d6ff'Ta5d6ff)Ta5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--inputTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6ffinput_fileTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffPath to input JSON fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--outputTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6ffoutput_fileTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffPath to output JSON fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff--nameTa5d6ff"Tb4b4b4,
Te6edf3destTff7b72=Ta5d6ff"Ta5d6fftarget_nameTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffNative name of the target language (e.g. Ta5d6ff'Ta5d6ff中文Ta5d6ff'Ta5d6ff for Chinese)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
T8b949e# Fallback to Environment Variables if arguments aren't provided
Te6edf3from_lang Tff7b72= Te6edf3argsTff7b72.Td2a8fffrom_lang Tff7b72or Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffARGOS_FROM_LANGTa5d6ff"Tb4b4b4)
Te6edf3to_lang Tff7b72= Te6edf3argsTff7b72.Td2a8ffto_lang Tff7b72or Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffARGOS_TO_LANGTa5d6ff"Tb4b4b4)
Te6edf3input_file Tff7b72= Te6edf3argsTff7b72.Td2a8ffinput_file Tff7b72or Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffARGOS_INPUT_FILETa5d6ff"Tb4b4b4)
Te6edf3output_file Tff7b72= Te6edf3argsTff7b72.Td2a8ffoutput_file Tff7b72or Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffARGOS_OUTPUT_FILETa5d6ff"Tb4b4b4)
Te6edf3target_name Tff7b72= Te6edf3argsTff7b72.Td2a8fftarget_name Tff7b72or Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffARGOS_TARGET_NAMETa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657allTb4b4b4(Tb4b4b4[Te6edf3from_langTb4b4b4, Te6edf3to_langTb4b4b4, Te6edf3input_fileTb4b4b4, Te6edf3output_fileTb4b4b4]Tb4b4b4)Tb4b4b4:
Te6edf3parserTff7b72.Td2a8ffprint_helpTb4b4b4(Tb4b4b4)
Te6edf3print_errorTb4b4b4(
Ta5d6ff"Ta5d6ffMissing required arguments. Please provide --from, --to, --input, and --output.Ta5d6ff"
Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3input_fileTb4b4b4)Tb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInput file not found: Tffd700{Te6edf3input_fileTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3print_infoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSource Language: Tffd700{Te6edf3ColorsTff7b72.Td2a8ffBOLDTffd700}Tffd700{Te6edf3from_langTffd700}Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3print_infoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTarget Language: Tffd700{Te6edf3ColorsTff7b72.Td2a8ffBOLDTffd700}Tffd700{Te6edf3to_langTffd700}Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3print_infoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInput File: Tffd700{Te6edf3ColorsTff7b72.Td2a8ffBOLDTffd700}Tffd700{Te6edf3input_fileTffd700}Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3print_infoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffOutput File: Tffd700{Te6edf3ColorsTff7b72.Td2a8ffBOLDTffd700}Tffd700{Te6edf3output_fileTffd700}Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff"Tb4b4b4)
T8b949e# Load JSON
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3input_fileTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3source_data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadTb4b4b4(Te6edf3fTb4b4b4)
Tff7b72except Te6edf3jsonTff7b72.Td2a8ffJSONDecodeError Tff7b72as Te6edf3eTb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid JSON in input file: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3start_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
T8b949e# Get Translator
Te6edf3translate_func Tff7b72= Te6edf3get_translation_funcTb4b4b4(Te6edf3from_langTb4b4b4, Te6edf3to_langTb4b4b4)
Te6edf3print_infoTb4b4b4(
Ta5d6ff"Ta5d6ffStarting translation. This may take a moment depending on the file size...Ta5d6ff"
Tb4b4b4)
Te6edf3translated_data Tff7b72= Te6edf3translate_dictTb4b4b4(Te6edf3source_dataTb4b4b4, Te6edf3translate_funcTb4b4b4, Te6edf3target_nameTb4b4b4)
T8b949e# Ensure output directory exists
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3output_fileTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
T8b949e# Save translated JSON
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3output_fileTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3jsonTff7b72.Td2a8ffdumpTb4b4b4(Te6edf3translated_dataTb4b4b4, Te6edf3fTb4b4b4, Te6edf3ensure_asciiTff7b72=Tff7b72FalseTb4b4b4, Te6edf3indentTff7b72=T79c0ff4Tb4b4b4)
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3eTb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not write to output file: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3elapsed_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start_time
Te6edf3print_successTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTranslation complete in Tffd700{Te6edf3elapsed_timeTffd700:Ta5d6ff.2fTffd700}Ta5d6ff seconds!Ta5d6ff"Tb4b4b4)
Te6edf3print_successTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffOutput saved to Tffd700{Te6edf3ColorsTff7b72.Td2a8ffBOLDTffd700}Tffd700{Te6edf3output_fileTffd700}Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────